// 什么是高阶函数，满足以下任何一个条件即可: 或者的关系
// 1） 接受一个或多个函数作为参数
// 2)  一个函数返回一个函数作为结果

// 高阶函数 是函数式编程的非常重要的核心概念
// 1.-------
function coreFunction(a, b, c) {
  console.log(a, b, c);
}
Function.prototype.before = function (callback) {
  return (...args) => {
    // 没有this arguments prototype
    callback(); // 扩展方法
    this(...args); // 执行原来的核心方法
  };
};
const enhancedCoreFunction = coreFunction.before(function () {
  console.log("before");
});
enhancedCoreFunction(1, 2, 3);

// 扩展原函数的功能，不破坏原来的功能，可以采用高阶函数

// 2.-------
// 给某些函数预置一些参数 可以采用高阶函数
function sum(a, b, c) {
  return a + b + c;
}
function apply(fn, ...presetArgs) {
  return function (...args) {
    return fn(...presetArgs, ...args);
  };
}
let add12 = apply(sum, 1, 2);
console.log(add12(3));
